/**
 * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
 * 有效字符串需满足：
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 */

/**
 * 思路：
 * 1、创建一个Map，把括号配对情况放进去
 * 2、创建一个Array，for循环遍历字符串，对于每一个字符，如果map里面有这个key，那说明他是一个左括号，从map里
 * 取得相对应的右括号（为什么？），把它push进数组里面。否则的话，它就是右括号，需要pop出数组里的第一个字符然后
 * 看它是否等于当前的字符，如果不相符，则返回false
 * 3、循环结束后，如果数组不为空，说明还剩一些左括号没有被闭合，返回false，否则返回true
*/

var isValid = function (s) {
  let map = new Map();
  map.set("{", "}");
  map.set("(", ")");
  map.set("[", "]");

  let stack = [];

  for (let i = 0; i < s.length; i++) {
    if (map.has(s[i])) {
      stack.push(map.get(s[i]));
    } else {
      if (stack.pop() !== s[i]) {
        return false;
      }
    }
  }

  if (stack.length !== 0) {
    return false;
  }

  return true;
};

// pop() 方法用于删除数组的最后一个元素并返回删除的元素
// push() 向数组的末尾添加一个或更多元素，并返回新的长度
// shift() 删除并返回数组的第一个元素
// unshift() 向数组的开头添加一个或更多元素，并返回新的长度
